package me.luger.core.commom.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.List;

/**
 * JsonUtil
 *
 * @author luger
 * @date 2016/8/3 0003
 */
public class JsonUtil {
    /**
     * @Title: String toString(Object obj)
     * @Description: 对象转换程json字符串
     * @param obj
     *            被转换的对象
     * @return 转换后的json字符串
     */
    public static String toString(Object obj) {
        return JSON.toJSONString(obj);
    }

    /**
     * 输出格式化的json文本
     * @param obj
     * @return
     */
    public static String toStringFormat(Object obj) {
        return JSON.toJSONString(obj,true);
    }

    /**
     * @Title: String toString(Object obj, SerializerFeature... features)
     * @Description: 对象转换程json字符串
     * @param obj
     *            被转换的对象
     * @param features
     *            序列化参数
     * @return 转换后的json字符串
     */
    public static String toString(Object obj, SerializerFeature... features) {
        return JSON.toJSONString(obj, features);
    }

    /**
     * @Title: String toStringWithoutSpecialChar(Object obj)
     * @Description: 不检测特殊字符，不会带双引号转义字符
     * @param obj
     *            被转换的对象
     * @return 转换后的json字符串
     */
    public static String toStringWithoutSpecialChar(Object obj) {
        return JSON
                .toJSONString(obj, SerializerFeature.DisableCheckSpecialChar);
    }

    /**
     * @Title: String toStringWithClassName(Object obj)
     * @Description: 写入class信息，在需要反序列化时特别有用
     * @param obj
     *            被转换的对象
     * @return 转换后的json字符串
     */
    public static String toStringWithClassName(Object obj) {
        return JSON.toJSONString(obj, SerializerFeature.WriteClassName);
    }

    /**
     * @Title: Object parse(String text)
     * @Description: 将json串转换成对象
     * @param text
     *            json字符串
     * @return 转换后的Object对象
     */
    public static Object parse(String text) {
        return JSON.parse(text);
    }

    /**
     * @Title: JSONObject parse2JsonObject(String text)
     * @Descrioption: 将字符串转成JSONObject对象
     * @param text
     *            json字符串
     * @return 转换后的JSONObject对象
     */
    public static JSONObject parse2JsonObject(String text) {
        try {
            return JSON.parseObject(text);
        } catch (Exception e) {
            return parse2JsonObjectEscape(text);
        }

    }

    /**
     * @Title: JSONObject parse2JsonObject(String text)
     * @Descrioption: 将字符串转成JSONObject对象,针对转义字符\做处理
     * @param text
     *            json字符串
     * @return 转换后的JSONObject对象
     */
    public static JSONObject parse2JsonObjectEscape(String text) {
		/*
		 * if(text.contains("\\")){ text = text.replaceAll("\\\\",""); }
		 */
        return JSON.parseObject(text);
    }

    /**
     * @Description 将字符串转成JSONArray对象
     * @param text
     * @return
     */
    public static JSONArray pase2JsonArray(String text) {
        try {
            return JSON.parseArray(text);
        } catch (Exception e) {
            return parse2JsonArrayEscape(text);
        }
    }

    /**
     * @Description 将字符串转成JSONArray对象，针对转义字符\做处理
     * @param text
     * @return
     */
    public static JSONArray parse2JsonArrayEscape(String text) {
        if (text.contains("\\")) {
            text = text.replaceAll("\\\\", "");
        }
        return JSON.parseArray(text);
    }

    /**
     * @Title: <T> T parse(String text, Class<T> clz)
     * @Description:将json串转换成对象
     * @param text
     *            json字符串
     * @param clz
     *            要转换成的json类
     * @return 转换后的clz对象
     */
    public static <T> T parse(String text, Class<T> clz) {
        return JSON.parseObject(text, clz);
    }

    public static <T> T parse(String text, TypeReference<T> type) {
        return JSON.parseObject(text, type.getType());
    }

    /**
     * @Title: <T> List<T> parseArray(String text, Class<T> clz)
     * @Description: 将json串转换成list对象
     * @param text
     *            json字符串
     * @param clz
     *            要转换成的json list对象内的对象类型
     * @return 转换后的list对象
     */
    public static <T> List<T> parseArray(String text, Class<T> clz) {
        return JSON.parseArray(text, clz);
    }

}
